from Levenshtein import distance  
from typing import List
from datetime import datetime  
  
def calculate_similarity(s1:str, s2:str)->float:  
        """  
        使用Levenshtein距离计算两个字符串的相似度。  
        相似度 = 1 - (Levenshtein距离 / 较长字符串的长度)  
        注意：这里相似度的计算方式可以根据需要调整。  
        """  
        len_s1, len_s2 = len(s1), len(s2)  
        if len_s1 == 0:  
            return 0 if len_s2 == 0 else 1  
        if len_s2 == 0:  
            return 1  
        # 计算Levenshtein距离  
        lev_distance = distance(s1, s2)  
        # 计算相似度  
        similarity = 1 - (lev_distance / max(len_s1, len_s2))  
        return similarity  
  

def sort_list_by_similarity(lst:List[str], target_string:str)->List[str]:  
    """  
    根据与target_string的相似度对列表lst进行排序。  
    """      
    
    # 使用列表推导式和calculate_similarity函数计算相似度  
    sorted_lst = sorted(lst, key=lambda x: calculate_similarity(x, target_string), reverse=True)  
    return sorted_lst  
  


def parse_datetime(date_str):
    """
    将日期或日期时间格式的字符串转换为datetime对象，如果字符串不符合格式则返回None。

    参数:
    date_str (str): 日期或日期时间格式的字符串

    返回:
    datetime对象或None
    """
    # 定义可能的日期时间格式
    formats = [
        '%Y-%m-%d %H:%M:%S',
        '%Y-%m-%d %H:%M',
        '%Y-%m-%d',
        '%Y/%m/%d %H:%M:%S',
        '%Y/%m/%d %H:%M',
        '%Y/%m/%d',
        '%d-%m-%Y %H:%M:%S',
        '%d-%m-%Y %H:%M',
        '%d-%m-%Y',
        '%d/%m/%Y %H:%M:%S',
        '%d/%m/%Y %H:%M',
        '%d/%m/%Y',
        '%Y.%m.%d %H:%M:%S',
        '%Y.%m.%d %H:%M',
        '%Y.%m.%d',
        '%Y%m%d %H:%M:%S',
        '%Y%m%d %H:%M',
        '%Y%m%d'
    ]

    for fmt in formats:
        try:
            return datetime.strptime(date_str, fmt)
        except ValueError:
            continue

    # 如果所有格式都不匹配，则返回None
    return None






# if __name__ == '__main__':
# # 示例  
#     my_list = ["apple", "banana", "aple", "orange", "app"]  
#     target_string = "apple"  
#     sorted_list = sort_list_by_similarity(my_list, target_string)  
#     print(sorted_list)
#     # 输出：['apple', 'aple', 'app']
    # 示例用法
    # date_str = "2023-10-05 14:30:00"
    # parsed_datetime = parse_datetime(date_str)
    # if parsed_datetime:
    #     print(f"解析成功: {parsed_datetime}")
    # else:
    #     print("解析失败，字符串不符合日期时间格式")
